VeraCrypt - Бесплатное надёжное шифрование дисков с открытым исходным кодом

Документация Технические подробности Ключевые файлы

# Ключевые файлы

Ключевой файл VeraCrypt – это файл, содержимое которого объединено с паролем. В качестве ключевого файла можно использовать любой файл. Пользователь также может сгенерировать ключевой файл с помощью встроенного генератора ключевых файлов, который использует VeraCrypt RNG для создания файла со случайным содержимым (см. подробности в разделе Генератор случайных чисел).

Максимальный размер ключевого файла не ограничен, однако обрабатываются только его первые 1 048 576 байт (1 МиБ) (все остальные байты игнорируются, чтобы не жертвовать производительностью из-за обработки очень больших файлов). Можно указывать один или несколько ключевых файлов (количество не ограничено).

Ключевые файлы могут храниться на токенах безопасности и смарт-картах, совместимых с PKCS-11 [23], защищённых несколькими пин-кодами (которые можно ввести с помощью аппаратной пин-панели или через графический интерфейс VeraCrypt).

Ключевые файлы обрабатываются и применяются к паролю следующим способом:

1. Пусть P это пароль тома VeraCrypt, указанный пользователем (может быть пустым)
2. Пусть KP это пул ключевых файлов
3. Пусть kpl это размер пула ключевых файлов KP, в байтах (64, то есть 512 бит);

   kpl должен быть кратен выходному размеру хеш-функции H

4. Пусть pl это длина пароля P, в байтах (в текущей версии: 0 ≤ pl ≤ 64)
5. Если kpl > pl, добавляем (kpl – pl) нулевых байт к паролю P (таким образом, pl = kpl)
6. Заполняем пул ключевых файлов KP нулевыми байтами в количестве kpl.
7. Для каждого ключевого файла выполняем следующие шаги:
   1. Устанавливаем положение указателя пула ключевых файлов в начало пула
   2. Инициализируем хеш-функцию H
   3. Загружаем все байты ключевого файла один за другим, и для каждого загруженного байта выполняем следующие шаги:
      1. Хешируем загруженный байт с помощью хеш-функции H без инициализации хеша, чтобы получить промежуточный хеш (состояние) M. Не финализируем хеш (состояние сохраняется для следующего раунда).
      2. Делим состояние M на отдельные байты.
         Например, если выходной размер хеша составляет 4 байта, (T0 || T1 || T2 || T3) = M
      3. Записываем эти байты (полученные на шаге 7.c.ii) по отдельности в пул ключевых файлов с помощью операции сложения по модулю 28 (не заменяя старые значения в пуле) в позиции указателя пула. После записи байта позиция указателя пула увеличивается на один байт. Когда указатель достигает конца пула, его положение устанавливается в начало пула.
8. Применяем содержимое пула ключевых файлов к паролю P, используя следующий метод:
   1. Делим пароль P на отдельные байты B0...Bpl-1.
      Обратите внимание, что если пароль был короче пула ключевых файлов, то пароль дополнялся нулевыми байтами до длины пула на шаге 5 (следовательно, в этот момент длина пароля всегда больше или равна длине пула ключевых файлов).
   2. Делим пул ключевых файлов KP на отдельные байты G0...Gkpl-1
   3. Для 0 ≤ i < kpl выполняем: Bi = Bi ⊕ Gi
   4. P = B0 || B1 || ... || Bpl-2 || Bpl-1
9. Пароль P (после применения к нему содержимого пула ключевых файлов) теперь передаётся в функцию формирования ключа заголовка PBKDF2 (PKCS #5 v2), которая его обрабатывает (вместе с солью и другими данными) используя выбранный пользователем криптографически безопасный алгоритм хеширования (например, SHA-512). См. подробности в разделе Формирование ключа заголовка, соль и количество итераций.

Роль хеш-функции H заключается просто в выполнении диффузии [2]. В качестве хеш-функции H применяется CRC-32. Обратите внимание, что вывод CRC-32 впоследствии обрабатывается с использованием криптографически безопасного хеш-алгоритма: содержимое пула ключевых файлов (в дополнение к хешированию с помощью CRC-32) применяется к паролю, который затем передаётся в функцию формирования ключа заголовка PBKDF2 (PKCS #5 v2), которая его обрабатывает (вместе с солью и другими данными), используя выбранный пользователем криптографически безопасный алгоритм хеширования (например, SHA-512). Результирующие значения используются для формирования ключа заголовка и вторичного ключа заголовка (режим XTS).

Следующий раздел >>